package JavaSE.StreamLearning.CountLetters;

import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.Charset;

/**
 *  作业 计算一个文本文件中的英文字符 空格字符 数字字符的个数
 *  原理
 *      通过字节流读取字节到缓冲数组中
 *      然后通过一个判断方法 遍历数组中的每个元素 利用ASCII判断每个元素属于哪个字符
 *
 *  问题
 *      中文字符是通过计算负数的字节个数 然后总数除以3得到的
 *      但是utf-8中 并不只是中文为负数 西欧中日韩语言都是负数
 *      因此并不能很好地判断中文字符个数
 */
public class CountLetters {
    public static void main(String[] args) throws IOException {
        int[] countResult = new int[4];
        FileInputStream fis = new FileInputStream("src\\JavaSE.StreamLearning.CountLetters\\a.txt");
        byte[] bytes = new byte[1024];
        int readCount;
        while((readCount = fis.read(bytes)) != -1) {
            count(countResult, bytes, readCount);
        }
        fis.close();
        System.out.println(countResult[0]);
        System.out.println(Charset.defaultCharset().toString());
        String charset = Charset.defaultCharset().toString();
        if (charset.equals("UTF-8")) {
            countResult[0] /= 3;
        } else {
            countResult[0] /= 2;
        }
        System.out.println("中文字符个数：" + countResult[0]);
        System.out.println("数字字符个数：" + countResult[1]);
        System.out.println("英文字符个数：" + countResult[2]);
        System.out.println("其他字符个数：" + countResult[3]);
    }

    private static void count(int[] countResult, byte[] bytes, int readCount) {
        for (int i = 0; i < readCount; i++) {
            if (bytes[i] < 0) {
                // 中文字符
                countResult[0]++;
            } else if (bytes[i] >= 48 && bytes[i] <= 57) {
                // 数字字符
                countResult[1]++;
            } else if ((bytes[i] >= 65 && bytes[i] <= 90) || (bytes[i] >= 97 && bytes[i] <= 122)) {
                // 英文字符
                countResult[2]++;
            } else {
                // 其他字符
                countResult[3]++;
            }
        }
    }
}
